import { V2NIMLoginStatus } from './enum'
import { NIM } from './index'

type V2NIMLoginOptions = {
  accountId: string
  token: string
}

interface V2NIMLoginService {
  login(options: V2NIMLoginOptions): void
}

export default class V2NIMLoginServiceImpl implements V2NIMLoginService {
  accountId: string = ''
  core: NIM
  loginStatus = V2NIMLoginStatus.V2NIM_LOGIN_STATUS_UNLOGIN

  constructor(core: NIM) {
    this.core = core
    this.core.logUtil.log('V2NIMLoginServiceImpl initialized')
  }

  // 重置模块数据
  reset() {}

  // 看起来 async/await 会被 @babel/preset-env 处理成 iterator 实现, 以及 regeneratorRuntime 这个变量
  // 这个变量是放在 regenerator-runtime 这个 polyfill 库中的
  // 仍需要 @babel/plugin-transform-runtime 做进一步处理
  async login(options: V2NIMLoginOptions) {
    if (this.loginStatus === V2NIMLoginStatus.V2NIM_LOGIN_STATUS_LOGOUT) {
      this.core.logUtil.log('V2NIMLoginServiceImpl login:', options)
      this.accountId = options.accountId
      return await fetch('https://example.com/login')
    }
    return Promise.reject('Login already start')
  }

  // 测试 const, 箭头函数可以被 @babel/preset-env 处理
  // 测试 map API. 的确不能被 @babel/preset-env 处理, 而需要 @babel/plugin-transform-runtime 做 polyfill
  mapTest() {
    const map = new Map()
    map.set('a', 1)
    map.forEach((key, value) => {
      console.log(key, value)
    })
    return new Promise((resolve) => {
      resolve(map.get('a'))
    })
  }

  // 销毁模块
  destroy() {
    this.reset()
  }
}
